Connectors: Add is_active callback support to plugin registration#11565
Connectors: Add is_active callback support to plugin registration#11565Adi-ty wants to merge 5 commits intoWordPress:trunkfrom
Conversation
Test using WordPress PlaygroundThe changes in this pull request can previewed and tested using a WordPress Playground instance. WordPress Playground is an experimental project that creates a full WordPress instance entirely within the browser. Some things to be aware of
For more details about these limitations and more, check out the Limitations page in the WordPress Playground documentation. |
|
The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the Core Committers: Use this line as a base for the props when committing in SVN: To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook. |
6377fdc to
341e216
Compare
|
Can you add an unit test that covers this new option? This would be similar to: wordpress-develop/tests/phpunit/tests/connectors/wpConnectorRegistry.php Lines 292 to 303 in 8270db8 In particular it would be useful to cover the path when Otherwise, this looks to go and should be included in WordPress 7.0 release. |
| $is_installed = file_exists( wp_normalize_path( WP_PLUGIN_DIR . '/' . $file ) ); | ||
| $is_activated = $is_installed && is_plugin_active( $file ); | ||
| $is_activated = (bool) call_user_func( $connector_data['plugin']['is_active'] ); | ||
| $is_installed = $is_activated || file_exists( WP_PLUGIN_DIR . '/' . $file ); |
There was a problem hiding this comment.
Two notes:
- the default
is_activecall is__return_truewhich always returns true, so when not defined, it will always assume the plugin is installed file_existsno longer normalizes the path
|
Some additional feedback to evaluate. The rest looks good to me. I would appreciate confirmation from @jorgefilipecosta, too. |
…s for plugin registration
598847d to
31eb00b
Compare
|
Hi @gziolo I pushed a commit addressing your feedback and passing an is_active callback for the ai providers. |
| } | ||
| } | ||
|
|
||
| if ( ! isset( $args['plugin']['is_active'] ) ) { |
Adds an optional `is_active` callable to the `plugin` definition accepted by `WP_Connector_Registry::register()`. The callback receives no arguments, must return a boolean, and is used by the Connectors screen to decide whether a connector's backing plugin is currently active. When omitted, it defaults to `__return_true`; when provided but not callable, registration fails with a `_doing_it_wrong()` notice. Developed in: #11565 Props iamadisingh, jorgefilipecosta, mukesh27, gziolo. Fixes #65020. git-svn-id: https://develop.svn.wordpress.org/trunk@62288 602fd350-edb4-49c9-b593-d223f7449a82
Adds an optional `is_active` callable to the `plugin` definition accepted by `WP_Connector_Registry::register()`. The callback receives no arguments, must return a boolean, and is used by the Connectors screen to decide whether a connector's backing plugin is currently active. When omitted, it defaults to `__return_true`; when provided but not callable, registration fails with a `_doing_it_wrong()` notice. Developed in: WordPress/wordpress-develop#11565 Props iamadisingh, jorgefilipecosta, mukesh27, gziolo. Fixes #65020. Built from https://develop.svn.wordpress.org/trunk@62288 git-svn-id: http://core.svn.wordpress.org/trunk@61568 1a063a9b-81f0-0310-95a4-ce76da25c4cd
Adds an optional `is_active` callable to the `plugin` definition accepted by `WP_Connector_Registry::register()`. The callback receives no arguments, must return a boolean, and is used by the Connectors screen to decide whether a connector's backing plugin is currently active. When omitted, it defaults to `__return_true`; when provided but not callable, registration fails with a `_doing_it_wrong()` notice. Developed in: #11565 Reviewed by desrosj. Merges [62288] to the 7.0 branch. Props iamadisingh, jorgefilipecosta, mukesh27, gziolo, desrosj. Fixes #65020. git-svn-id: https://develop.svn.wordpress.org/branches/7.0@62309 602fd350-edb4-49c9-b593-d223f7449a82
Adds an optional `is_active` callable to the `plugin` definition accepted by `WP_Connector_Registry::register()`. The callback receives no arguments, must return a boolean, and is used by the Connectors screen to decide whether a connector's backing plugin is currently active. When omitted, it defaults to `__return_true`; when provided but not callable, registration fails with a `_doing_it_wrong()` notice. Developed in: WordPress/wordpress-develop#11565 Reviewed by desrosj. Merges [62288] to the 7.0 branch. Props iamadisingh, jorgefilipecosta, mukesh27, gziolo, desrosj. Fixes #65020. Built from https://develop.svn.wordpress.org/branches/7.0@62309 git-svn-id: http://core.svn.wordpress.org/branches/7.0@61589 1a063a9b-81f0-0310-95a4-ce76da25c4cd
…7897) * Connectors: Add is_active callback support to plugin registration Backports the WP Core changes from WordPress/wordpress-develop#11565 so that AI provider connectors (and Akismet) report the correct plugin status. Without an explicit `is_active` callback the registry's new `__return_true` default made every pre-registered connector appear active even when the underlying plugin was not installed, so the Connectors screen showed a "Set up" button instead of "Install" whenever Gutenberg was active. - Mirror the registry's `__return_true` default and the simplified is_installed/is_activated derivation in the script module data. - Wire AI providers to `$ai_registry->hasProvider( $id )` so their status reflects whether the provider plugin is actually available. - Set Akismet's `is_active` to `is_plugin_active( 'akismet/akismet.php' )` since Gutenberg pre-registers it (Core does not), and the new default would otherwise mark it as always installed. * Connectors: Show Akismet with Install button when not installed The previous client-side workaround hid Akismet entirely whenever the plugin was not installed, because the server could not report Akismet's install status reliably. With the new `is_active` callback wired up on the server side, `isInstalled` is now accurate, so Akismet can be rendered like any other default connector and offer an Install button when the plugin is missing. * Connectors: Restore E2E coverage for Akismet Install button Re-adds the test that was removed when Akismet was hidden client-side in #76962. Now that the server reports Akismet's install status correctly and the JS hide logic is gone, the screen should render the Akismet card with an Install button when the plugin is not installed — make sure that's covered. * Connectors: Update E2E test to expect Install button label * Connectors: Drop default is_active fallback in registry All pre-registered connectors now supply their own `is_active` callback, so the `__return_true` default is no longer needed. Removing it aligns the registry with the upstream WP Core PR and avoids silently masking connectors that forget to declare an `is_active` callback. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Guard against missing is_active in script module data Now that the registry no longer injects a default `__return_true` for `is_active`, a connector registered with a `plugin.file` but without an `is_active` callback would trigger an undefined-index warning. Treat that case as active on the assumption the plugin only registers the connector when it is loaded. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Detect Akismet via AKISMET_VERSION constant Switch the Akismet `is_active` callback from `is_plugin_active()` to a `defined( 'AKISMET_VERSION' )` check so it does not have to load `wp-admin/includes/plugin.php`. This keeps the callback safe to invoke in non-admin requests where pulling in the admin plugin helpers would be unnecessary overhead. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ADd backport changelog * Connectors: Remove outdated is_active default from docblock The default `__return_true` fallback was dropped from the registry, but the docblock still advertised it. Remove the stale line so callers do not assume a default exists. * Connectors: Restore Akismet hide-when-not-installed special case Bring back the JS-side guard that hides Akismet when the plugin is not installed. Akismet is bundled with WordPress and the product decision is to keep it out of the connectors list when missing — other connectors remain visible because plugins like Woo or SEO suites benefit from the auto-install/activate flow for their own third-party integrations. Also drop the E2E test that asserted the inverse (Install button visible for Akismet), since it conflicts with the restored behavior. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Document default is_active behavior in docblock When the is_active callback is omitted and a file is provided, the connector is treated as active under the assumption that the plugin must be loaded in order to register itself. Spell that out so callers do not mistake the omission for a no-op. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Use validate_plugin() to detect installed plugin file Switch the install probe from a raw file_exists() to validate_plugin(), which adds path traversal protection and confirms the file is a recognised plugin (not just any file at that path). Restores the require_once for wp-admin/includes/plugin.php that this function needs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Default plugin is_active to __return_true Align with WordPress core, which sets is_active to '__return_true' when omitted at registration. This lets the rendering site call is_active unconditionally instead of branching on whether it was provided. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Align phpstan type with stored connector shape After the registry now always initializes `plugin` and defaults `is_active` to `__return_true`, mark `plugin` as required and `file` as optional in the @phpstan-type so static analysis matches what `register()` actually returns. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: t-hamano <wildworks@git.wordpress.org> Co-authored-by: peterwilsoncc <peterwilsoncc@git.wordpress.org> Co-authored-by: mukeshpanchal27 <mukesh27@git.wordpress.org> Co-authored-by: jorgefilipecosta <jorgefilipecosta@git.wordpress.org> Co-authored-by: westonruter <westonruter@git.wordpress.org>
…7897) * Connectors: Add is_active callback support to plugin registration Backports the WP Core changes from WordPress/wordpress-develop#11565 so that AI provider connectors (and Akismet) report the correct plugin status. Without an explicit `is_active` callback the registry's new `__return_true` default made every pre-registered connector appear active even when the underlying plugin was not installed, so the Connectors screen showed a "Set up" button instead of "Install" whenever Gutenberg was active. - Mirror the registry's `__return_true` default and the simplified is_installed/is_activated derivation in the script module data. - Wire AI providers to `$ai_registry->hasProvider( $id )` so their status reflects whether the provider plugin is actually available. - Set Akismet's `is_active` to `is_plugin_active( 'akismet/akismet.php' )` since Gutenberg pre-registers it (Core does not), and the new default would otherwise mark it as always installed. * Connectors: Show Akismet with Install button when not installed The previous client-side workaround hid Akismet entirely whenever the plugin was not installed, because the server could not report Akismet's install status reliably. With the new `is_active` callback wired up on the server side, `isInstalled` is now accurate, so Akismet can be rendered like any other default connector and offer an Install button when the plugin is missing. * Connectors: Restore E2E coverage for Akismet Install button Re-adds the test that was removed when Akismet was hidden client-side in #76962. Now that the server reports Akismet's install status correctly and the JS hide logic is gone, the screen should render the Akismet card with an Install button when the plugin is not installed — make sure that's covered. * Connectors: Update E2E test to expect Install button label * Connectors: Drop default is_active fallback in registry All pre-registered connectors now supply their own `is_active` callback, so the `__return_true` default is no longer needed. Removing it aligns the registry with the upstream WP Core PR and avoids silently masking connectors that forget to declare an `is_active` callback. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Guard against missing is_active in script module data Now that the registry no longer injects a default `__return_true` for `is_active`, a connector registered with a `plugin.file` but without an `is_active` callback would trigger an undefined-index warning. Treat that case as active on the assumption the plugin only registers the connector when it is loaded. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Detect Akismet via AKISMET_VERSION constant Switch the Akismet `is_active` callback from `is_plugin_active()` to a `defined( 'AKISMET_VERSION' )` check so it does not have to load `wp-admin/includes/plugin.php`. This keeps the callback safe to invoke in non-admin requests where pulling in the admin plugin helpers would be unnecessary overhead. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ADd backport changelog * Connectors: Remove outdated is_active default from docblock The default `__return_true` fallback was dropped from the registry, but the docblock still advertised it. Remove the stale line so callers do not assume a default exists. * Connectors: Restore Akismet hide-when-not-installed special case Bring back the JS-side guard that hides Akismet when the plugin is not installed. Akismet is bundled with WordPress and the product decision is to keep it out of the connectors list when missing — other connectors remain visible because plugins like Woo or SEO suites benefit from the auto-install/activate flow for their own third-party integrations. Also drop the E2E test that asserted the inverse (Install button visible for Akismet), since it conflicts with the restored behavior. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Document default is_active behavior in docblock When the is_active callback is omitted and a file is provided, the connector is treated as active under the assumption that the plugin must be loaded in order to register itself. Spell that out so callers do not mistake the omission for a no-op. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Use validate_plugin() to detect installed plugin file Switch the install probe from a raw file_exists() to validate_plugin(), which adds path traversal protection and confirms the file is a recognised plugin (not just any file at that path). Restores the require_once for wp-admin/includes/plugin.php that this function needs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Default plugin is_active to __return_true Align with WordPress core, which sets is_active to '__return_true' when omitted at registration. This lets the rendering site call is_active unconditionally instead of branching on whether it was provided. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Align phpstan type with stored connector shape After the registry now always initializes `plugin` and defaults `is_active` to `__return_true`, mark `plugin` as required and `file` as optional in the @phpstan-type so static analysis matches what `register()` actually returns. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: t-hamano <wildworks@git.wordpress.org> Co-authored-by: peterwilsoncc <peterwilsoncc@git.wordpress.org> Co-authored-by: mukeshpanchal27 <mukesh27@git.wordpress.org> Co-authored-by: jorgefilipecosta <jorgefilipecosta@git.wordpress.org> Co-authored-by: westonruter <westonruter@git.wordpress.org>
…7897) * Connectors: Add is_active callback support to plugin registration Backports the WP Core changes from WordPress/wordpress-develop#11565 so that AI provider connectors (and Akismet) report the correct plugin status. Without an explicit `is_active` callback the registry's new `__return_true` default made every pre-registered connector appear active even when the underlying plugin was not installed, so the Connectors screen showed a "Set up" button instead of "Install" whenever Gutenberg was active. - Mirror the registry's `__return_true` default and the simplified is_installed/is_activated derivation in the script module data. - Wire AI providers to `$ai_registry->hasProvider( $id )` so their status reflects whether the provider plugin is actually available. - Set Akismet's `is_active` to `is_plugin_active( 'akismet/akismet.php' )` since Gutenberg pre-registers it (Core does not), and the new default would otherwise mark it as always installed. * Connectors: Show Akismet with Install button when not installed The previous client-side workaround hid Akismet entirely whenever the plugin was not installed, because the server could not report Akismet's install status reliably. With the new `is_active` callback wired up on the server side, `isInstalled` is now accurate, so Akismet can be rendered like any other default connector and offer an Install button when the plugin is missing. * Connectors: Restore E2E coverage for Akismet Install button Re-adds the test that was removed when Akismet was hidden client-side in #76962. Now that the server reports Akismet's install status correctly and the JS hide logic is gone, the screen should render the Akismet card with an Install button when the plugin is not installed — make sure that's covered. * Connectors: Update E2E test to expect Install button label * Connectors: Drop default is_active fallback in registry All pre-registered connectors now supply their own `is_active` callback, so the `__return_true` default is no longer needed. Removing it aligns the registry with the upstream WP Core PR and avoids silently masking connectors that forget to declare an `is_active` callback. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Guard against missing is_active in script module data Now that the registry no longer injects a default `__return_true` for `is_active`, a connector registered with a `plugin.file` but without an `is_active` callback would trigger an undefined-index warning. Treat that case as active on the assumption the plugin only registers the connector when it is loaded. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Detect Akismet via AKISMET_VERSION constant Switch the Akismet `is_active` callback from `is_plugin_active()` to a `defined( 'AKISMET_VERSION' )` check so it does not have to load `wp-admin/includes/plugin.php`. This keeps the callback safe to invoke in non-admin requests where pulling in the admin plugin helpers would be unnecessary overhead. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ADd backport changelog * Connectors: Remove outdated is_active default from docblock The default `__return_true` fallback was dropped from the registry, but the docblock still advertised it. Remove the stale line so callers do not assume a default exists. * Connectors: Restore Akismet hide-when-not-installed special case Bring back the JS-side guard that hides Akismet when the plugin is not installed. Akismet is bundled with WordPress and the product decision is to keep it out of the connectors list when missing — other connectors remain visible because plugins like Woo or SEO suites benefit from the auto-install/activate flow for their own third-party integrations. Also drop the E2E test that asserted the inverse (Install button visible for Akismet), since it conflicts with the restored behavior. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Document default is_active behavior in docblock When the is_active callback is omitted and a file is provided, the connector is treated as active under the assumption that the plugin must be loaded in order to register itself. Spell that out so callers do not mistake the omission for a no-op. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Use validate_plugin() to detect installed plugin file Switch the install probe from a raw file_exists() to validate_plugin(), which adds path traversal protection and confirms the file is a recognised plugin (not just any file at that path). Restores the require_once for wp-admin/includes/plugin.php that this function needs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Default plugin is_active to __return_true Align with WordPress core, which sets is_active to '__return_true' when omitted at registration. This lets the rendering site call is_active unconditionally instead of branching on whether it was provided. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Align phpstan type with stored connector shape After the registry now always initializes `plugin` and defaults `is_active` to `__return_true`, mark `plugin` as required and `file` as optional in the @phpstan-type so static analysis matches what `register()` actually returns. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: t-hamano <wildworks@git.wordpress.org> Co-authored-by: peterwilsoncc <peterwilsoncc@git.wordpress.org> Co-authored-by: mukeshpanchal27 <mukesh27@git.wordpress.org> Co-authored-by: jorgefilipecosta <jorgefilipecosta@git.wordpress.org> Co-authored-by: westonruter <westonruter@git.wordpress.org> Source: WordPress/gutenberg@ef41f12
…7897) * Connectors: Add is_active callback support to plugin registration Backports the WP Core changes from WordPress/wordpress-develop#11565 so that AI provider connectors (and Akismet) report the correct plugin status. Without an explicit `is_active` callback the registry's new `__return_true` default made every pre-registered connector appear active even when the underlying plugin was not installed, so the Connectors screen showed a "Set up" button instead of "Install" whenever Gutenberg was active. - Mirror the registry's `__return_true` default and the simplified is_installed/is_activated derivation in the script module data. - Wire AI providers to `$ai_registry->hasProvider( $id )` so their status reflects whether the provider plugin is actually available. - Set Akismet's `is_active` to `is_plugin_active( 'akismet/akismet.php' )` since Gutenberg pre-registers it (Core does not), and the new default would otherwise mark it as always installed. * Connectors: Show Akismet with Install button when not installed The previous client-side workaround hid Akismet entirely whenever the plugin was not installed, because the server could not report Akismet's install status reliably. With the new `is_active` callback wired up on the server side, `isInstalled` is now accurate, so Akismet can be rendered like any other default connector and offer an Install button when the plugin is missing. * Connectors: Restore E2E coverage for Akismet Install button Re-adds the test that was removed when Akismet was hidden client-side in #76962. Now that the server reports Akismet's install status correctly and the JS hide logic is gone, the screen should render the Akismet card with an Install button when the plugin is not installed — make sure that's covered. * Connectors: Update E2E test to expect Install button label * Connectors: Drop default is_active fallback in registry All pre-registered connectors now supply their own `is_active` callback, so the `__return_true` default is no longer needed. Removing it aligns the registry with the upstream WP Core PR and avoids silently masking connectors that forget to declare an `is_active` callback. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Guard against missing is_active in script module data Now that the registry no longer injects a default `__return_true` for `is_active`, a connector registered with a `plugin.file` but without an `is_active` callback would trigger an undefined-index warning. Treat that case as active on the assumption the plugin only registers the connector when it is loaded. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Detect Akismet via AKISMET_VERSION constant Switch the Akismet `is_active` callback from `is_plugin_active()` to a `defined( 'AKISMET_VERSION' )` check so it does not have to load `wp-admin/includes/plugin.php`. This keeps the callback safe to invoke in non-admin requests where pulling in the admin plugin helpers would be unnecessary overhead. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ADd backport changelog * Connectors: Remove outdated is_active default from docblock The default `__return_true` fallback was dropped from the registry, but the docblock still advertised it. Remove the stale line so callers do not assume a default exists. * Connectors: Restore Akismet hide-when-not-installed special case Bring back the JS-side guard that hides Akismet when the plugin is not installed. Akismet is bundled with WordPress and the product decision is to keep it out of the connectors list when missing — other connectors remain visible because plugins like Woo or SEO suites benefit from the auto-install/activate flow for their own third-party integrations. Also drop the E2E test that asserted the inverse (Install button visible for Akismet), since it conflicts with the restored behavior. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Document default is_active behavior in docblock When the is_active callback is omitted and a file is provided, the connector is treated as active under the assumption that the plugin must be loaded in order to register itself. Spell that out so callers do not mistake the omission for a no-op. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Use validate_plugin() to detect installed plugin file Switch the install probe from a raw file_exists() to validate_plugin(), which adds path traversal protection and confirms the file is a recognised plugin (not just any file at that path). Restores the require_once for wp-admin/includes/plugin.php that this function needs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Default plugin is_active to __return_true Align with WordPress core, which sets is_active to '__return_true' when omitted at registration. This lets the rendering site call is_active unconditionally instead of branching on whether it was provided. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Connectors: Align phpstan type with stored connector shape After the registry now always initializes `plugin` and defaults `is_active` to `__return_true`, mark `plugin` as required and `file` as optional in the @phpstan-type so static analysis matches what `register()` actually returns. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: t-hamano <wildworks@git.wordpress.org> Co-authored-by: peterwilsoncc <peterwilsoncc@git.wordpress.org> Co-authored-by: mukeshpanchal27 <mukesh27@git.wordpress.org> Co-authored-by: jorgefilipecosta <jorgefilipecosta@git.wordpress.org> Co-authored-by: westonruter <westonruter@git.wordpress.org> Source: WordPress/gutenberg@051e6c3
Backport of WordPress/gutenberg#76994. Adds an optional
is_activecallable to theplugindefinition whenregistering a connector via
WP_Connector_Registry::register().The Connectors screen previously resolved a connector's active/installed status by checking
is_plugin_active()andfile_exists()againstWP_PLUGIN_DIRonly. Plugins installed as must-use plugins — or loaded from non-standard paths could not be detected this way, causing their connectors to disappear from the screen even though the plugin was in use.Trac ticket: https://core.trac.wordpress.org/ticket/65020
This Pull Request is for code review only. Please keep all other discussion in the Trac ticket. Do not merge this Pull Request. See GitHub Pull Requests for Code Review in the Core Handbook for more details.